<?php
/**
 * 判断缩略图是否存在，如果不存在，就生成一个
 * 并且返回生成后的缩略图的信息
 */
class MiniaturePro {

	/**
	 * 图片文件根路径
	 */
	protected $_base_file_path = "../../../img1";
	
	/**
	 * 图片保存子路径
	 */
	protected $_save_sub_path = "mini/";
	
	/**
	 * 最大缩略图文件大小 700K
	 */
	protected $_MAX_FILE_SIZE = 700000;
	
	/**
	 * 设置图片根路径
	 * $baseFilePath 图片根路径
	 */
	public function setBaseFilePath($baseFilePath){
		if($baseFilePath){
			$this->_base_file_path = $baseFilePath;
		}
	}
	
	/**
	 * 获取图片所在根路径
	 */
	public function getBasesFilePath(){
		return $this->_base_file_path;
	}
	
	/**
	 * 文件是否存在
	 */
	public function hasMiniFile($filePath){
		return is_file($this->_base_file_path.$filePath);
	}
	
	
	/**
	 * 设置图片保存文件夹名
	 * $baseFilePath 图片保存文件夹名
	 */
	public function setSaveSubPath($_save_sub_path){
		if($_save_sub_path){
			$this->_save_sub_path = $_save_sub_path;
		}
	}
	
	
	/**
	 * 获取缩略图保存文件夹
	 */
	public function getSaveSubPath(){
		return $this->_save_sub_path;
	}
	
	/**
	 * 生成缩略图
	 */
	function resizeImage($imgPath,$maxWidth,$maxHeight){
		//获取源文件扩展名
		$extName = $this->getExtName($imgPath);
		//设置为全路径
		$srcFilePath = $this->_base_file_path.$imgPath;

		if($extName == "jpg"){
			$im = imagecreatefromjpeg($srcFilePath); 
		}elseif($extName == "png"){
			$im = imagecreatefrompng($srcFilePath); 
		}elseif($extName == "gif"){
			$im = imagecreatefromgif($srcFilePath); 
		}
		if(!$im){
			return array("success"=>"0","msg"=>"没找到原始图片");
		}
		$width 		= imagesx($im);	//原图宽度
		$height 	= imagesy($im);	//原图高度

		$newWidth; 		//缩略图宽度
		$newHeight;		//缩略图高度
		if(!$maxWidth && !$maxHeight){
			return array("success"=>"0","msg"=>"传入参数错误，缺少参数");
		}else if($maxWidth){
			$newWidth = $maxWidth;
			$newHeight = round($height*($maxWidth/$width));
		}else{
			$newHeight = $maxHeight;
			$newWidth = round($width*($maxHeight/$height));
		}
		//如果缩略图比原图还大，目前是可以的。
		//之前返回success=>2
		//原图文件名
		$srcFileName = $this->getFileName($srcFilePath);
		$fileName = $newWidth."_".$newHeight."_".strtolower($srcFileName);
		//构造另存文件路径   
		$miniPath = $this->getFilePath($srcFilePath).$this->_save_sub_path.$fileName;
		$newIm = imagecreatetruecolor($newWidth, $newHeight); 
		imageCopyreSampled($newIm, $im, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 
		
		//构建生成路径
		$miniPath = $this->getFileFirstName($miniPath).".jpg";
		for($i=90;$i>0;$i=$i-5){
			ImageJpeg ($newIm,$miniPath,$i);
			if(abs(filesize($miniPath))<=(int)$this->_MAX_FILE_SIZE){
				break;
			}
		}
		ImageDestroy($newIm); 
		
		return array(
					"success"=>"1"
					,"msg"=>"成功生成缩略图"
					,"miniFileName"=>$fileName
					,"miniWidth"=>$newWidth
					,"miniHeight"=>$newHeight
					,"subPath"=>$subPath
					,"srcFileName"=>$srcFileName
					,"srcWidth"=>$width
					,"srcHeight"=>$height);
	}



	/**
	 * 获取文件名（除去扩展名）
	 * $fPath 文件全名
	 * @return 除去扩展名的文件名
	 */
	function getFileFirstName($fPath){
		$fPath = str_replace("\\","/",$fPath);
		$index =  $this->lastIndexOf($fPath,"/");
		if($index){
			$rPath = substr($fPath,0,$index+1);
			$fName = substr($fPath,$index+1,strlen($fPath));
		}else{
			$rPath = "";
			$fName = $fPath;
		}
		$index = $this->lastIndexOf($fName,".");
		if($index){
			$fName = substr($fName,0,$index);
		}
		return $rPath.$fName;
	}

	/**
	 * 从文件路径中获取文件名
	 * $fPath 文件路径
	 * @return 文件名
	 */
	function getFileName($fPath){
		$fPath = str_replace("\\","/",$fPath);
		$index =  $this->lastIndexOf($fPath,"/");
		if($index){
			return substr($fPath,$index+1,strlen($fPath));
		}
		return "";
	}

	/**
	 * 从文件路径中获取该文件所在的路径字符串
	 * 末尾带 /
	 * $fPath 文件路径
	 * @return 文件所在路径
	 */
	function getFilePath($fPath){
		$fPath = str_replace("\\","/",$fPath);
		$index =  $this->lastIndexOf($fPath,"/");
		if($index){
			return substr($fPath,0,$index+1);
		}
		return "/";
	}

	/**
	 * 获取文件扩展名（小写）
	 * $fPath 文件路径
	 * @return 文件扩展名 
	 */
	function getExtName($fPath){
		$index =  $this->lastIndexOf($fPath,".");
		if($index){
			return strtolower(substr($fPath,$index+1,strlen($fPath)));
		}
		return "";
	}


	/**
	 * 最后一个指定字符出现的位置
	 * $all 待检测的字符串
	 * $part 指定检测字符
	 * @return 字符所在位置，如果没找到在返回空
	 */
	function lastIndexOf($all,$part){
		if(trim($all)=="" || trim($part)==""){
			return 0;
		}
		while(strpos($all,$part)!==false){
			$indexof = strpos($all,$part);
			$lastindexof = $lastindexof + $indexof + $offset;
			$all = substr($all,$indexof+ strlen($part));
			$offset = strlen($part);
		}
		return $lastindexof;
	}
	
	
	/**
	 * 判断字符串开头是否为指定字符
	 * $str 待判断字符串
	 * $part 指定字符
	 */
	function startsWith($str,$part){
		//若第一个字符串长度小于第二个的时候，必须指定返回false，
		//否则substr_compare遇到这种情况会返回0（即相当，与事实不符合）
		if(strlen($str)<strlen($str)){
			return false;
		}else{
			////当第一个长度大于第二个时才开始判断
			return !substr_compare($str,$part,0,strlen($part));
		}
	}

 
	/**
	 * 判断字符串末尾是否为指定字符
	 * $str 待判断字符串
	 * $part 指定字符
	 */
	function endsWith($str,$part){
		//若第一个字符串长度小于第二个的时候，必须指定返回false，
		//否则substr_compare遇到这种情况会返回0（即相当，与事实不符合）
		if(strlen($str)<strlen($part)){
			return false;
		}else{
			//从第一个字符串减去第二个字符串长度处开始判断
			return !substr_compare($str,$part,strlen($str)-strlen($part),strlen($part));
		}
	}
}
?>